package com.gitee.feizns.quickstart.janino;

import lombok.SneakyThrows;
import org.codehaus.janino.ExpressionEvaluator;

import java.util.Map;

/**
 * janino
 * @author feizns
 * @since 2024/12/24
 */
public abstract class Janino {

    /**
     * 评估
     * @param expression 表达
     * @param returnType 返回类型
     * @param data 数据
     * @return {@link T}
     */
    @SuppressWarnings("unchecked")
    @SneakyThrows
    public static <T> T eval(String expression, Class<T> returnType, Map<String, Object> data) {
        //执行器
        ExpressionEvaluator evaluator = new ExpressionEvaluator();
        //设置参数类型及名称
        evaluator.setParameters(
                data.keySet().toArray(new String[]{}),
                data.values().stream().map(Object::getClass).toArray(Class[]::new)
        );
        // 设置表达式的返回结果也为int类型
        evaluator.setExpressionType(returnType);
        // 这里处理（扫描，解析，编译和加载）上面定义的算数表达式.
        evaluator.cook(expression);
        // 根据输入的a和b参数执行实际的表达式计算过程
        return (T) evaluator.evaluate(data.values().toArray(new Object[]{}));
    }

}
